/**
 * 负责递归路由和动态组件渲染
 */
/**
 * 导入动态组件的函数，
 * 例：views/test/Demo.vue  -> Demo 组件的加载
 * @param {String} fileStr
 */
/**
 * 导入动态组件的函数，
 * 例：views/test/Demo.vue  -> Demo 组件的加载
 * @param {String} fileStr
 */
 function _import(fileStr) {
    return () => import('@/' + fileStr)
}

/**
 * 请求的路由数据 递归循环出菜单和路由
 * @param {Array} routerList
 */
 export function formatMenu(routerList) {
    let menu = []; // 菜单数组
    let router = []; // 路由数组
    /**
     * 循环请求的路由数据
     */
    routerList.forEach((item, i) => {
        // /**
        //  * 判断当前数据是否属于菜单
        //  * 是:将数据加入到menu数据中
        //  * 否：往下执行
        //  */
        menu.push({
            icon: item.c_icon ? item.c_icon : '',
            router: item.path,
            path: item.path,
            title: item.name,
            name: item.name,
            key: item.id,
            id: item.id,
            children: []
        })
        /**
         * 判断是否路由
         * 是：开始将数据增加到路由中
         * 否：往下执行
         */
        if (item.path) {
            /**
             * 判断是否有组件
             * 是：将组件创建出来并数据增加到路由中
             * 否：只需将数据增加到路由中
             */
            if (item.component) {
                router.push({
                    path: item.path,
                    component: _import(item.component),
                    meta: {
                        ...item.meta,
                        title: item.name,
                        parent: item.id
                    },
                    children: []
                })
            } else {
                router.push({
                    path: item.path,
                    meta: {
                        ...item.meta,
                        title: item.name,
                        parent: item.id
                    },
                    children: []
                })
            }
        }
        // /**
        //  * 判断数据中是否有子数据
        //  * 是：准备递归子组件
        //  * 否：往下执行
        //  */
        if (item.children && item.children.length) {
            var {rmenu, rrouter} = formatMenu(item.children); // 将子数据传入递归函数，返回 菜单数据和路由数据
            /**
             * 判断当前的菜单是否有元素
             * 是:将递归的子数据递归返回的菜单数据放入当前菜单的chilren数组中
             * 否：说明menu是空数组，直接将子数据递归返回的菜单数据赋值给menu
             */
            if (menu.length) {
                menu[i].children = rmenu;
            } else {
                menu = rmenu;
            }
            /**
             * 和菜单一样，判断路由是否存在元素
             * 是：往路由的children中存入
             * 否：将返回的路由直接赋值给router
             */
            if (router.length) {
                /**
                 * 判断当前数据是否是路由
                 * 是：将返回的路由放入到当前路由的children中
                 * 否:将返回的路由存入当前数据中
                 */
                if (item.isRouter) {
                    router[i].children = rrouter;
                } else {
                    router.push(...rrouter);
                }
            } else {
                router = rrouter;
            }

        }
    });
    // 将递归的菜单和路由返回
    return {rmenu: menu, rrouter: router};
}
